/**
 * 版权所有(C)，上海勾芒信息科技，2017，所有权利保留。
 * 
 * 项目名：	cards-web
 * 文件名：	WxComponentConfigStorage.java
 * 模块说明：	
 * 修改历史：
 * 2017年4月13日 - Debenson - 创建。
 */
package me.chanjar.weixin.component.api;

import java.util.concurrent.locks.Lock;

import me.chanjar.weixin.component.bean.WxComponentAccessToken;
import me.chanjar.weixin.component.bean.author.WxAuthorizerAccessToken;
import me.chanjar.weixin.component.bean.author.WxPreauthorCode;

/**
 * 微信开放平台账户配置存储
 * 
 * @author Debenson
 * @since 0.1
 */
public interface WxCompConfigStorage {

  /**
   * APPID
   * 
   * @return
   */
  String getAppId();

  /**
   * APP secret
   * 
   * @return
   */
  String getSecret();

  /**
   * 校验Token
   * 
   * @return
   */
  String getToken();

  /**
   * 消息加解密Key
   * 
   * @return
   */
  String getAesKey();

  /**
   * component_verify_ticket
   * 
   * @return
   */
  String getVerifyTicket();

  /** 获取第三方平台component_access_token */
  String getAccessToken();

  Lock getAccessTokenLock();

  boolean isAccessTokenExpired();

  /**
   * 强制将access token过期掉
   */
  void expireAccessToken();

  /**
   * 应该是线程安全的
   *
   * @param accessToken
   *          要更新的WxAccessToken对象
   */
  void updateAccessToken(WxComponentAccessToken accessToken);

  /**
   * 应该是线程安全的
   *
   * @param accessToken
   *          新的accessToken值
   * @param expiresInSeconds
   *          过期时间，以秒为单位
   */
  void updateAccessToken(String accessToken, int expiresInSeconds);

  /**
   * 取得开放平台服务的安全域名
   * 
   * TODO 这里可能不需要返回域名，应该可以直接读取第三方平台账户配置的安全域名
   * 
   * @return
   */
  String getDomain();

  /**
   * 取得第三方授权回调页的url
   * 
   * @return
   */
  String getAuthorizationCallbackUrl();

  /**
   * 预授权码。预授权码用于公众号或小程序授权时的第三方平台方安全验证
   * 
   * @return
   */
  String getPreauthorizationCode();

  Lock getPreauthorCodeLock();

  /**
   * 判断预授权是否过期
   * 
   * @return
   */
  boolean isPreauthorCodeExpired();

  /**
   * 强制将{@link #getPreauthorizationCode()}过期掉
   */
  void expirePreauthorCode();

  /**
   * 更新预授权码和有效期, 应该是线程安全的
   *
   * @param preauthorCode
   *          要更新的WxPreauthorCode对象
   */
  void updatePreauthorCode(WxPreauthorCode preauthorCode);

  /**
   * 更新预授权码和有效期, 应该是线程安全的
   *
   * @param preauthorCode
   *          新的preauthorCode值
   * @param expiresInSeconds
   *          过期时间，以秒为单位
   */
  void updatePreauthorCode(String preauthorCode, int expiresInSeconds);

  Lock getAuthorizerAccessTokenLock();

  /**
   * 取得第三方开放平台调用凭据（authorizer_access_token）
   * 
   * @return
   */
  String getAuthorizerAccessToken(String appId);

  /**
   * 第三方开放平台调用凭据（authorizer_access_token）是否过期
   * 
   * @param appId
   *          小程序或公众号的appid
   * @return
   */
  boolean isAuthorizerAccessTokenExpired(String appId);

  /**
   * 强制将第三方开放平台调用凭据（authorizer_access_token）过期掉
   * 
   * <br>
   * 需要根据appId找到小程序或公众号的配置，然后设置相应值 。
   * 
   * @param appId
   *          小程序或公众号的appid
   */
  void expireAuthorizerAccessToken(String appId);

  /**
   * 更新第三方开放平台调用凭据（authorizer_access_token）和过期时间
   * 
   * <br>
   * 需要根据appId找到小程序或公众号的配置，然后设置相应值 。
   * 
   * @param appId
   *          小程序或公众号的appid
   * @param token
   *          授权凭据
   */
  void updateAuthorizerAccessToken(String appId, WxAuthorizerAccessToken token);

  /**
   * 更新第三方开放平台调用凭据（authorizer_access_token）和过期时间
   * 
   * <br>
   * 需要根据appId找到小程序或公众号的配置，然后设置相应值 。
   * 
   * @param appId
   *          小程序或公众号的appid
   * @param token
   *          调用凭据
   * @param expiresInSeconds
   *          过期时间
   */
  void updateAuthorizerAccessToken(String appId, String token, int expiresInSeconds);

  /**
   * 更新第三方开放平台调用凭据（authorizer_access_token）、过期时间和接口调用凭据刷新令牌
   * 
   * <br>
   * 需要根据appId找到小程序或公众号的配置，然后设置相应值 。
   * 
   * @param appId
   *          小程序或公众号的appid
   * @param token
   *          调用凭据
   * @param expiresInSeconds
   *          过期时间
   * @param authorizerRefreshToken
   *          接口调用凭据刷新令牌
   */
  void updateAuthorizerAccessToken(String appId, String token, int expiresInSeconds,
      String authorizerRefreshToken);

  /**
   * 取得接口调用凭据刷新令牌
   * 
   * @param appId
   *          小程序或公众号的appid
   * @return 接口调用凭据刷新令牌
   */
  String getAuthorizerRefreshToken(String appId);

}
